package com.iepacj.thkjava.innerclass.closure;

public class MyIncrement {

	public void increment() {
		System.out.println("MyIncrement increment()");
	}
	
	static void f(MyIncrement mi) {
		mi.increment();
	}
	
}

/**
 * MyIncrement类已经有了一个increment()方法
 * 如果想使用Incrementable接口的increment()方法
 * 那就必须使用内部类, 独立的实现这个接口
 * @ClassName: Callee2
 * @Description: TODO
 * @author hang.yu
 * @date 2016年3月9日 下午3:30:01
 * @version V1.0
 */
class Callee2 extends MyIncrement{
	
	private int i = 0;
	
	public void increment() {
		super.increment();
		i++;
		System.out.println("Callee2: i = " + i);
	}

	Incrementable getCallbackReference() {
		return new Closure();
	}
	
	/**
	 * 内部类Closure实现了Incrementable, 提供一个返回Callee2的钩子
	 * 无论是谁获得这个引用, 都只能调用increment方法
	 */
	private class Closure implements Incrementable {

		public void increment() {
			System.out.println("Closure increment");
			Callee2.this.increment();
		}
	}
}

class Caller {
	
	private Incrementable callbackRef;
	
	Caller(Incrementable incre) {
		callbackRef = incre;
	}
	
	/**
	 * Caller对象可以使用callbackRef引用回调Callee2对象
	 */
	void go() {
		callbackRef.increment();
	}
}













